const express = require("express")
const app = express()

//定义错误中间件
// const joi = require("@hapi/joi")
const joi = require("joi")
// 导入配置文件
const config = require("./config")

// 解析 token 的中间件
const expressJWT = require("express-jwt")

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(
  expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] })
)

//配置解析表单的中间件,这个中间件必须放到路由前面
app.use(express.urlencoded({ extended: false }))
//配置cors中间件
const cors = require("cors")
app.use(cors()) //全局挂载

//自定义中间件，处理失败结果
const err = require("./errorFunction/errorhandler")
app.use(err.errff)

//导入路由模块
const router = require("./router/user")
app.use("/api", router) //使用router路由模块

// 导入并使用用户信息路由模块
const userinfoRouter = require("./router/userinfo")
//以 /my 开头的接口，都是有权限的接口，需要进行 Token 身份认证
app.use("/my", userinfoRouter)

//导入使用文章分类模块
const articleCateRouter = require("./router/article")
app.use("/my/article", articleCateRouter)

// 错误中间件，数据验证的时候
app.use(function (err, req, res, next) {
  // 数据验证失败
  if (err instanceof joi.ValidationError) return res.cc(err)
  // 未知错误
  res.cc(err)
})

// 错误中间件，身份认证，token的时候
app.use(function (err, req, res, next) {
  // 省略其它代码...

  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") return res.cc("身份认证失败！")

  // 未知错误...
})

app.listen(3007, () => {
  console.log("project is running about poing 3007")
})
